/**
 * @file axios封装
 * @author: lvjiran
 * @date: 2021-06-20
 */

import Axios from 'axios';
import Router from '../../router';
import Vue from 'vue';
// 添加请求拦截器
Axios.interceptors.request.use(
    config => {
        // 如果是登录，不需要拦截
        if (config.url.includes('login/user')) {
            return config;
        }

        // 如果是请求业务接口需要校验token是否过期
        const token = window.sessionStorage.getItem('token');
        if (token) {
            config.headers.token = token;
        } else {
            Router.push('/login');
        }

        return config;
    },
    error => {
        alert('传参错误，请检查！');
        return Promise.reject(error);
    }
);

// 添加响应拦截器-返回状态判断
Axios.interceptors.response.use(
    res => {
        const { url } = res.config;
        const { code, data, message } = res.data;

        //登录超时拦截
        if (+code === 401) {
            // 如果token失效.跳到登录页面
            Router.push('/login');
        }

        // 失败拦截
        if (+code !== 200) {
            // 提示错误
            // 若code为-1，后台异常，优先弹出data信息
            if (code === '-1') {
                Vue.prototype.$message({
                    type: 'warning',
                    message: data || message
                });
            }
            return Promise.reject(res.data);
        }
        // 如果请求路径是登录，则重写token
        if (url.includes('login/user')) {
            window.sessionStorage.setItem('token', data);
        } else if (url.includes('login/phone')) {
            window.sessionStorage.setItem('token', data);
        }

        return res;
    },
    error => {
        alert('网络异常，请稍后再试！');
        return Promise.reject(error);
    }
);

const action = (url, method, data = {}, option = {}) => {
    // 跨域请求时是否需要使用凭证
    option.withCredentials = true;

    const promise = new Promise((resolve, reject) => {
        let req = null;
        // post请求
        if (method === 'post') {
            req = Axios[method](url, data, option);
        } else {
            option.params = data;
            req = Axios[method](url, option);
        }
        req.then(
            res => {
                let { data } = res;
                // 转对象
                try {
                    if (data && typeof data === 'string') {
                        data = JSON.parse(data);
                    }
                } catch {
                    console.error('JSON.parse error');
                }
                resolve(data);
            },
            error => {
                reject(error);
            }
        );
    });

    return promise;
};

const httpExt = {
    /**
     * get 请求
     *
     * @param {string} url 请求地址
     * @param {Object} data 请求数据
     * @param {Object} option 其他请求设置
     * @return {Object} promise对象
     */
    get(url, data, option) {
        // 添加时间戳,防止ie有缓存
        const newDate = data ? Object.assign(data, { time: new Date().getTime() }) : null;

        return action(url, 'get', newDate, option);
    },

    /**
     * post 请求
     *
     * @param {string} url 请求地址
     * @param {Object} data 请求数据
     * @param {Object} option 其他请求设置
     * @return {Object} promise对象
     */
    post(url, data, option) {
        return action(url, 'post', data, option);
    }
};

export default {
    install(Vue) {
        Vue.prototype.$httpExt = () => httpExt;
    }
};
